// 进制转换
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#define SIZE 20
// 利用栈的先进后出的特点，实现进制转换
// 进制转换中，其他进制转换与10进制的相互转换比较简单，其他进制的相互转换，必须要经过十进制


typedef struct linear_stack
{
    int a[SIZE];
    int top;
}Stack;

// 初始化栈
void init(Stack *stack){
    stack->top=-1;
}

// 入栈
int push(Stack *stack, int data){
    int top;
    if(stack->top==SIZE-1){
        printf("栈已满...\n");
        return SIZE;
    }
    else{
        stack->a[++(stack->top)] = data;
        return stack->top;
    }
}

// 出栈
int pop(Stack *stack){
    int del;
    if(stack->top==-1){
        printf("栈已空，里面没有元素...\n");
        return -1;
    }
    else{
        del=stack->a[stack->top];
        stack->top--;
        return del;
    }
}

// 其他进制转化为十进制（暂时只支持低于10进制的转换）
// 忽略了C语言的强制转换符对字符数转换成对应的ASCii码
int convert_to_10(char *data, int system){
    int len = (int)strlen(data)-1;
    int result=0;
    int temp=0;
    for(int i=len;i>=0;i--){
        temp= ((int)(data[i])-48) * pow(system, len-i);

        result += temp;
    }
    return result;
}

// 10进制转换成其他进制
void * convert_to(int data, int system){
    Stack stack;
    init(&stack);
    int rem=0;
    // 取余并存到栈中
    while(data>system){
        rem = data%system;
        push(&stack, rem);
        data = (int)(data/system);
    }
    push(&stack, data);
    while(stack.top!=-1){
        printf("%d\n", pop(&stack));
    }
}
int main(){
    int res = convert_to_10("17342", 8);
    printf("%d\n", res);
    int conv = convert_to(res, 8);
    return 0;
}